﻿//----------------------------------------------------------------
// Desc: 对象管理器
// Edit: ShowLong, http://blog.csdn.net/showlong
//
// Date Created: 2012-04-04
//
// Update Date : 
//
// Copyright (c) Fuel4D (http://www.fuel4d.com), All rights reserved.
//
//----------------------------------------------------------------
#pragma once


#include "IFObj_Sprite.h"
#include "IFObj_Animation.h"
#include "IFObj_Avatar.h"


class IFObjMgr : public IFService
{
protected:
    IFObjMgr()
        :IFService(0)
    {}

public:
    // 创建精灵
    virtual IFSpriteObject* NewSprite(FIDSPRITE id, size_t spr_idx) = 0;
    virtual IFSpriteObject* NewSprite(FIDSPRITE id, FIDHASH hash) = 0;
    FINLINE IFSpriteObject* NewSprite(FIDSPRITE id, const WCHAR* spr_name);
    FINLINE IFSpriteObject* NewSprite(FIDSPRITE id, const ACHAR* spr_name);
    // 删除精灵
    virtual void DelSprite(IFSpriteObject* spr) = 0;
    FINLINE void DelSpriteEx(IFSpriteObject*& spr);

    // 创建精灵组
    virtual IFSpriteGroup* NewSpriteGroup(FIDSPRITE id, int group_id) = 0;
    // 删除精灵组
    virtual void DelSpriteGroup(IFSpriteGroup* gp) = 0;
    FINLINE void DelSpriteGroupEx(IFSpriteGroup*& gp);

    // 创建CD精灵
    virtual IFSpriteCooling* NewCooling(FIDSPRITE id, size_t spr_idx) = 0;
    virtual IFSpriteCooling* NewCooling(FIDSPRITE id, FIDHASH hash) = 0;
    FINLINE IFSpriteCooling* NewCooling(FIDSPRITE id, const WCHAR* spr_name);
    FINLINE IFSpriteCooling* NewCooling(FIDSPRITE id, const ACHAR* spr_name);
    // 删除CD精灵
    virtual void DelCooling(IFSpriteCooling* cd) = 0;
    FINLINE void DelCoolingEx(IFSpriteCooling*& cd);

    // 创建扭曲精灵
    virtual IFSpriteDistortion* NewDistortion(FIDSPRITE id, size_t spr_idx, int cols, int rows) = 0;
    virtual IFSpriteDistortion* NewDistortion(FIDSPRITE id, FIDHASH hash, int cols, int rows) = 0;
    FINLINE IFSpriteDistortion* NewDistortion(FIDSPRITE id, const WCHAR* spr_name, int cols, int rows);
    FINLINE IFSpriteDistortion* NewDistortion(FIDSPRITE id, const ACHAR* spr_name, int cols, int rows);
    // 删除扭曲精灵
    virtual void DelDistortion(IFSpriteDistortion* dis) = 0;
    FINLINE void DelDistortionEx(IFSpriteDistortion*& dis);

    // 创建粒子发射器
    virtual IFSpriteParticle* NewParticle(FIDSPRITE id, size_t part_idx) = 0;
    virtual IFSpriteParticle* NewParticle(FIDSPRITE id, FIDHASH hash) = 0;
    FINLINE IFSpriteParticle* NewParticle(FIDSPRITE id, const WCHAR* part_name);
    FINLINE IFSpriteParticle* NewParticle(FIDSPRITE id, const ACHAR* part_name);
    // 删除粒子发射器
    virtual void DelPartilce(IFSpriteParticle* part) = 0;
    FINLINE void DelPartilceEx(IFSpriteParticle*& part);

    // 创建轨迹特效
    virtual IFSpriteTrack* NewTrack(FIDSPRITE id, size_t part_idx) = 0;
    virtual IFSpriteTrack* NewTrack(FIDSPRITE id, FIDHASH hash) = 0;
    FINLINE IFSpriteTrack* NewTrack(FIDSPRITE id, const WCHAR* part_name);
    FINLINE IFSpriteTrack* NewTrack(FIDSPRITE id, const ACHAR* part_name);
    // 删除轨迹特效
    virtual void DelTrack(IFSpriteTrack* track) = 0;
    FINLINE void DelTrackEx(IFSpriteTrack*& track);

    // 创建2D骨骼动画
    virtual IFSpriteAnimate* NewAnimate(FIDSPRITE id, size_t anim_idx) = 0;
    // 创建2D骨骼动画
    virtual IFSpriteAnimate* NewAnimate(FIDSPRITE id, const WCHAR* anim_name) = 0;
    virtual IFSpriteAnimate* NewAnimate(FIDSPRITE id, const ACHAR* anim_name) = 0;
    // 删除2D骨骼动画
    virtual void DelAnimate(IFSpriteAnimate* anim) = 0;
    // 删除2D骨骼动画
    virtual void DelAnimateEx(IFSpriteAnimate*& anim) = 0;

    // 创建模型动画
    // .id 已经注册过的模型动画ID
    virtual IFAnimation* NewAnimation(FIDMODEL id) = 0;
    // 创建模型动画，通过文件
    virtual IFAnimation* NewAnimationByFile(const WCHAR* filename) = 0;
    virtual IFAnimation* NewAnimationByFile(const ACHAR* filename) = 0;
    // 删除模型动画
    virtual void DelAnimation(IFAnimation* obj) = 0;
    // 删除模型动画
    virtual void DelAnimationEx(IFAnimation*& obj) = 0;
    // 初始化时装系统
    // .part_lst 时装的部数数量及各部位的名字
    virtual void InitAvatar(FVStringW& part_lst) = 0;
    virtual void InitAvatar(FVStringA& part_lst) = 0;
    // 获取时装系统各部位名字
    virtual FVStringW& GetAvatarInfo() = 0;
    // 创建时装对象（注意：时装对象不需要删除，它将在主骨架删除的时候自动删除）
    // .parent 父骨架
    virtual IFAvatar* NewAvatar(IFAnimation* parent) = 0;
};


#include "IFObjMgr_inl.h"